﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using l1cs.server.serverpackets;
using l1cs.server.model;
using l1cs.server.datatables;

namespace l1cs.server.clientpackets
{
    public class C_ChatWhisper : ClientBasePacket
    {
        private const String _C_CHAT_WHISPER = "[C] C_ChatWhisper";
        private static Logger _log = Logger.getLogger( typeof( C_ChatWhisper ).FullName );

        public C_ChatWhisper( byte[] abyte0, ClientThread client )
            : base( abyte0 )
        {
            String targetName = readS();
            String text = readS();
            L1PcInstance whisperFrom = client.getActiveChar();
            // チャット禁止中の場合
            if ( whisperFrom.hasSkillEffect( 1005 ) )
            {
                whisperFrom.sendPackets( new S_ServerMessage( 242 ) ); // 現在チャット禁止中です。
                return;
            }
            // ウィスパー可能なLv未満の場合
            if ( whisperFrom.getLevel() < Config.WHISPER_CHAT_LEVEL )
            {
                whisperFrom.sendPackets( new S_ServerMessage( 404, Convert.ToString( Config.WHISPER_CHAT_LEVEL ) ) ); // %0レベル以下ではウィスパー、パーティーチャットは使用できません。
                return;
            }
            L1PcInstance whisperTo = L1World.getInstance().getPlayer( targetName );
            // ワールドにいない場合
            if ( whisperTo == null )
            {
                whisperFrom.sendPackets( new S_ServerMessage( 73, targetName ) ); // \f1%0はゲームをしていません。
                return;
            }
            // 自分自身に対するwisの場合
            if ( whisperTo.Equals( whisperFrom ) )
            {
                return;
            }
            // 遮断されている場合
            if ( whisperTo.getExcludingList().contains( whisperFrom.getName() ) )
            {
                whisperFrom.sendPackets( new S_ServerMessage( 117, whisperTo
                        .getName() ) ); // %0があなたを遮断しました。
                return;
            }
            // ゲームオプションでOFFにしている場合
            if ( !whisperTo.isCanWhisper() )
            {
                whisperFrom.sendPackets( new S_ServerMessage( 205, whisperTo
                        .getName() ) );
                return;
            }

            ChatLogTable.getInstance().storeChat( whisperFrom, whisperTo, text, 1 );
            whisperFrom.sendPackets( new S_ChatPacket( whisperTo, text,
                    Opcodes.S_OPCODE_GLOBALCHAT, 9 ) );
            whisperTo.sendPackets( new S_ChatPacket( whisperFrom, text,
                    Opcodes.S_OPCODE_WHISPERCHAT, 16 ) );
        }

        override
        public String getType()
        {
            return _C_CHAT_WHISPER;
        }
    }
}
